#ifndef ERR_H
#define ERR_H

#include <stdlib.h>
#include <stddef.h>
#include <string.h>
#include <stdarg.h>
#include <errno.h>

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @details 打印错误信息
*/
#define errPrint(format,...)                   \
	do{                                        \
		__errPrint__(format, ##__VA_ARGS__);   \
	}while(0)

/**
 * @details 打印错误信息，附带调试信息
*/
#define errPrint_debug(format,...)                                                  \
	do{                                                                             \
		__errPrint__("Error occurs at file <%s>, line <%d>.\n",__FILE__,__LINE__);  \
		__errPrint__("Errno value:<%d>, reason:<%s>.\n",errno,strerror(errno));     \
		__errPrint__ (format, ##__VA_ARGS__);                                       \
	} while (0)

/**
 * @details 打印错误信息并终止线程
*/
#define errExit(format, ...)                    \
	do{                                         \
		errPrint (format, ##__VA_ARGS__);       \
		exit (EXIT_FAILURE);                    \
	} while (0)

/**
 * @details 打印错误并终止线程，附带调试信息
*/
#define errExit_debug(format, ...)              \
	do{                                         \
		errPrint_debug (format, ##__VA_ARGS__); \
		exit (EXIT_FAILURE);                    \
	} while (0)


void __errPrint__ (const char *format, ...);


#ifdef __cplusplus
}
#endif

#endif
